package com.java.basis.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 因为接口不能实例化，new Runnable（）是一个实现接口Runnable的类的对象，后面的run方法是该类里实现的方法，这就是匿名内部类的写法
 *
 * 匿名内部类也就是没有名字的内部类
 * 正因为没有名字，所以匿名内部类只能使用一次，它通常用来简化代码编写
 * 但使用匿名内部类还有个前提条件：必须继承一个父类或实现一个接口
 * 这里正是实现Runnable接口的简化代码
 *
 * 那么这里用到的Runnable接口是什么？
 * @author wangning
 * @create 2021-04-25 8:51
 */
public class TestNewThread01 {
	//继承Thread类并重写run方法
	public static class RunableTask implements Runnable{
		@Override
		public void run(){
			System.out.println("I am a child theread");
		}
	}

	//继承Thread类并重写run方法
	public static class MyThread extends Thread{
		@Override
		public void run(){
			System.out.println("I am a child theread");
		}
	}

	//创建任务类，类似Runnable
	public static class CallerTask implements Callable<String>{
		@Override
		public String call() throws Exception{
			return "hello";
		}
	}

	public static void main(String[] args) {
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("args = " + args.length);
			}
		});
		t1.start();

		//1.实现Runnable接口的run方法
		//创建线程
		RunableTask task = new RunableTask();
		//启动线程
		new Thread(task).start();

		//2.继承Thread类并重写run方法
		//创建线程
		MyThread thread = new MyThread();
		//启动线程
		thread.start();

		//3.使用FutureTask方式
		//创建异步任务
		FutureTask<String> futureTask = new FutureTask<>(new CallerTask());
		//启动线程
		new Thread(futureTask).start();
		try{
			//等待任务执行完毕，并返回结果
			String result = futureTask.get();
			System.out.println(result);
		} catch (ExecutionException | InterruptedException e){
			e.printStackTrace();
		}


	}
}
